package com.example.homework;

import java.io.*;

/**
 * 目标：使用Java程序开发一个复制文件夹的方法并且需要复制文件夹中所有的文件
 */
public class HomeWork01 {
    public static void main(String[] args) throws Exception {
        // 创建File对象srcDir,代表源文件夹
        File srcDir = new File("D:\\File\\Test");
        // 创建File对象destDir,代表目标文件夹(把源文件夹拷贝到目标文件夹中)
        File destDir = new File("D:\\File\\Test2");
        // 调用copyDirToDir方法,传递源文件夹和目标文件夹,完成文件夹的复制
        copyDirToDir(srcDir, destDir);
        System.out.println("文件夹复制完毕!!!");
    }

    /**
     * 复制文件到文件夹
     * @param file 源文件
     * @param dir 目标文件
     */
    public static void copyFileToDir(File file, File dir) throws Exception {
        // 1.创建文件字节输入流FileInputStream类的对象，绑定源文件
        InputStream is = new FileInputStream(file);

        // 2.定义一个byte数组，保存每次读取到的字节数量
        byte[] bytes = new byte[1024];

        // 3.定义一个变量接收读取的字节数量
        int len = 0;

        // 4.给目标文件夹创建目标文件对象
        File destFile = new File(dir, file.getName());

        // 5.创建文件字节输出流OutputStream的对象，绑定目标文件
        OutputStream os = new FileOutputStream(destFile);

        // 6.循环的读取源文件，写入目标文件
        while ((len = is.read(bytes)) != -1) {
            os.write(bytes, 0, len);
        }

        // 7.关闭资源
        os.close();
        is.close();
    }


    /**
     * 复制文件夹到文件夹
     * @param srcDir 源文件夹
     * @param destDir 目标文件夹
     */

    public static void copyDirToDir(File srcDir, File destDir) throws Exception {
        // 1.在目标文件夹创建源文件夹
        File newFile = new File(destDir, srcDir.getName());
        // 判断目标文件夹是否存在，不存在就创建
        if (!newFile.exists()) {
            // 因为可能是多级的文件夹，所以使用mkdirs()
            newFile.mkdirs();
        }

        // 2.获取源文件夹的所有对象文件和文件夹对于的File对象数组
        File[] files = srcDir.listFiles();

        // 3.判断这个对象数组是null或者没有内容直接返回
        if (files == null || files.length == 0) {
            return;
        }

        // 4.遍历这个对象数组
        for (File file : files) {
            // 5.判断这个对象是文件，如果是文件调用copyFileToDir方法，如果是文件夹，就递归调用copyDirToDir方法
            if (file.isFile()) {
                copyFileToDir(file, newFile);
            } else {
                copyDirToDir(file, newFile);
            }
        }
    }
}
